package it.storm.solution;

/**
 * 999. 可以被一步捕获的棋子数
 * https://leetcode-cn.com/problems/available-captures-for-rook/
 */
public class Solutions_999 {
    public static void main(String[] args) {
//        char[][] board = {{'.', '.', '.', '.', '.', '.', '.', '.'},
//                {'.', '.', '.', 'p', '.', '.', '.', '.'},
//                {'.', '.', '.', 'R', '.', '.', '.', 'p'},
//                {'.', '.', '.', '.', '.', '.', '.', '.'},
//                {'.', '.', '.', '.', '.', '.', '.', '.'},
//                {'.', '.', '.', 'p', '.', '.', '.', '.'},
//                {'.', '.', '.', '.', '.', '.', '.', '.'},
//                {'.', '.', '.', '.', '.', '.', '.', '.'}};  // output: 3

        char[][] board = {{'.', '.', '.', '.', '.', '.', '.', '.'},
                {'.', 'p', 'p', 'p', 'p', 'p', '.', '.'},
                {'.', 'p', 'p', 'B', 'p', 'p', '.', '.'},
                {'.', 'p', 'B', 'R', 'B', 'p', '.', '.'},
                {'.', 'p', 'p', 'B', 'p', 'p', '.', '.'},
                {'.', 'p', 'p', 'p', 'p', 'p', '.', '.'},
                {'.', '.', '.', '.', '.', '.', '.', '.'},
                {'.', '.', '.', '.', '.', '.', '.', '.'}};  // output: 0
        int result = numRookCaptures(board);
        System.out.println(result);
    }

    public static int numRookCaptures(char[][] board) {
        int res = 0;
        // 方向数组：上、下、左、右
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (board[i][j] == 'R') {
                    // 找到“车”的位置
                    for (int[] dir : directions) {
                        // 上下左右四个方向上，开始“捕获”行动
                        res += catchPawn(i, j, dir, board);
                    }
                }
            }
        }
        return res;
    }

    public static int catchPawn(int x, int y, int[] dir, char[][] board) {
        while (true) {
            // 变化 x 轴或 y 轴
            x += dir[0];
            y += dir[1];
            if (x >= 0 && x < 8 && y >= 0 && y < 8) {
                // 在棋盘内
                if (board[x][y] == 'B') {
                    // 遇到象即返回
                    return 0;
                } else if (board[x][y] == 'p') {
                    // “捕获”到卒即返回
                    return 1;
                }
            } else {
                break;
            }
        }
        return 0;
    }
}
